/**
 *
 * v 1.15 [17.08.09] by ELLO
 *
 * request 
 * - dWindow.js
 *
 *	http://code.google.com/p/wedit/
 **/
var __formElementIterator = 0;

var wEdit = new Class({
	
	Implements: [Events, Options],
	
	'options' : {
		'action'  : 'test.php',
		'name'    : 'wEdit',
		'target'  : 'auto',
		'width'   : '500px',
		'height'  : '600px',
		'debug'   : false,
		'icon'    : null,
		'title'   : '&nbsp;',
		'addClass': null,
		'shadow'  : true
	},
	
	'editorWindow' 	: null,
	'tinymceWindow' : {},
	'tinymceEditId' : null,
	'form' 			: {},
	'windowOpen' 	: false,
	
	/**
	 * 
	 **/
	'initialize' : function(options){
		
		var options = options || {};
			
		this.setOptions(options);
			
		
	},
	
	'open' : function(){
		this.fireEvent('open', [1]);
	},
	/*
	'close' : function(){
		
		//this.fireEvent('cancel');
		//this.fireEvent('close');
		this.editorWindow.close();
		this.windowOpen = false;
	},
	*/
	'hide' : function(){
		this.editorWindow.hide();
	},
	
	
	/**
	 * создать фрейм для сохранения данных
	 **/
	'createFrame' : function(){
		
		/* если таргет не задан создать фрейм */
		if (this.options.target != 'auto') return ;
			
		/* имя фрейма */
		this.options.target = this.name + '-auto-frame';
		
		//var firs_load = true;
		if ($chk($(this.options.target))) return true;
		
		this.frame = new IFrame({
			'id' : this.options.target,
			'src' : 'about:blank',
			'styles':{
				'display' : typeof(_DEBUG_MODE)!='undefined'?'':'none'
			}
		}).inject(document.body);
		
	},
	
	/* создать таблицу формы */
	'createForm' : function(){
		
		/* создание формы */
		this.form = new Element("form", {
			"action": this.options.action + "",
			"method": "post",
			"enctype": 'multipart/form-data',
			'encoding': 'multipart/form-data',	// хак для IE
			"target": this.options.target,
			'class' : 'w-edit'
		});

		
	},
	
	///////////!!!!!!!!!!!!!!!!!!
	'load': function(data){
		
		if (!data){
			alert('wEdit:load error');
			return;
		}
		
		this.createFrame();
		
		this.createForm();
		
		//количество елементов в форме
		var dataLen = data.length;
		
		// вывод елементов
		for (i = 0; i < dataLen; i++) {
			
			var el = new wEdit.formElement(data[i], this, i);
			if (el)el.inject(this.form);
			
		}
		
		this.addControl();
		
		if (this.editorWindow == null) this._initWindow();
		
		this.editorWindow.load(this.form);
		
		//this.editorWindow.title = this.options.title;
		
		//this.editorWindow.center();
		//this.editorWindow.show();
		
		if (!this.windowOpen) this.show();
		
		this.fireEvent('onshow');
		
	}, 
	
	/**
	 * блок кнопок управления
	 **/
	'addControl' : function(){
		
		
		this.control = new Element('div',{
			'class':'control'
		});
		
		/*
		 * кнопка (ок)
		 */
		var button_save = new Element('span',{
			'class': 'button'
		});
		new Element("input",{
			"name":"wedit_submit",
			"class":"save",
			"type":"submit",
			"value":"Ok",
			"events":{
				"click":function(event){
					
					this.fireEvent('onsubmit', [event]);
					
					//спрятать елементыф формы
					this.form.setStyle('display', 'none');
					
					// показать загрузку
					this.editorWindow.content.addClass('loading');
					
					// закрыть окно по завершении отправки данных
					
					var onFrameLoad = function (){
						
						this.editorWindow.close();
						
					}
					
					//$(this.options.target).removeEvent('load', onFrameLoad.bind(this));
					$(this.options.target).addEvent('load', onFrameLoad.bind(this));
					
					
				}.bind(this)
			}
		}).inject(button_save);
		
		button_save.inject(this.control);
		
		/*
		 * кнопка (Cancel)
		 */
		var button_cancel = new Element('span', {
			'class': 'button'
		});
		
		new Element("input",{
			"type":"button",
			"class":"cancel",
			"value":"Cancel",
			"events":{
				"click":function(event){
					
					//TODO 
					//this.close(event);
					this.editorWindow.close();
					
				}.bind(this)
			}
		}).inject(button_cancel);
		button_cancel.inject(this.control);
		
		this.control.inject(this.form);
	},
	
	'_initWindow' : function(){
		
		this.editorWindow = new dWindow({
			'icon'		: this.options.icon,
			'width'		: this.options.width.toInt(),
			'height'	: this.options.height.toInt(),
			'minWidth'	: 180,
			'minHeight'	: 160,
			'title'		: this.options.title,
			'addClass'  : this.options.addClass,
			'shadow'	: this.options.shadow
		});
		
		this.editorWindow.addEvent('onclose',function(event){
			
			this.windowOpen = false;
			
			this.fireEvent('oncancel',[event]);
			this.fireEvent('onclose',[event]);
			
		}.bind(this));
		
		
		
		this.editorWindow.addEvent('create', function(event){
			this.fireEvent('beforeshow', [event]);
		}.bind(this));
		
	},
	
	'show':function(){
		
		if (this.editorWindow == null) this._initWindow();
		
		this.editorWindow.show();
		
		this.windowOpen = true;
		//$(this.options.target).removeEvent()
	}
});

/**
 * Элементы формы
 **/


wEdit.formElement = new Class({
	
	//Extends: wEdit,
	
	'initialize': function(element, wEdit){
		
		this.wEdit = wEdit;
		
		this.form = wEdit.form;
		
		
		if (element.type && this[element.type]){
			return this[element.type](element);
		}else{
			return this.emptyElement();
		}
		
		return false;
	},
	
	'addFormElement' : function(formObject){
		
		var label = formObject.label || false;
		var data  = formObject.data  || '';
		
		
		/* строка с формами */
		var row = new Element('div',{
			'class':'row'
		});
		
		if (__formElementIterator++ % 2 == 0){
			row.addClass('odd');
		}else{
			row.addClass('even');
		}
		
		/* название елемента формы */
		if (label){
			
			var label = new Element('div',{
				'class':'label'
			});
			var label_container = new Element('div', {
				'class':'container'
			}).appendText(formObject.label).inject(label);
			
			label.inject(row);
			
		}
		
		/* элемент формы */
		var data = new Element('div',{
			'class': 'data'
		});
		var data_container = new Element('div',{
			'class': 'container'
		});
		if ($type(formObject.data) == 'string'){
			new Element('div', {'html':formObject.data}).inject(data_container);
		}
		
		if ($type(formObject.data) == 'element'){
			
			formObject.data.inject(data_container);
			
		}
		data_container.inject(data);
		data.inject(row);
		
		new Element('div', {'class':'clear'}).inject(row);
		
		
		return row;
		
	},
	
	/*
	 * пустой елемент
	 */
	'emptyElement' : function(){
		return new Element('div', {'class':'hidden'});
	},

	/*
	 * select
	 */
	'select': function(element){
		
		if (element.readonly){
			new Element('input',{
				'type'  : 'hidden',
				'name'  : element.name,
				'value' : element.value
			}).inject(this.wEdit.form);
			element.disabled = true;
		}
		
		var select = new Element('select',{
			'name'	   : element.name,
			'disabled' : element.disabled || false,
			'readonly' : true
		});
		
		for (key in element.options) {
			
			if ($type(element.options[key]) !='string') continue;
			
			var selected = (key==element.value?true:false);
			
			var o = new Element('option',{
				'value': key,
				'html' : element.options[key]
			}).inject(select).selected = selected;
			
		}
		
		return this.addFormElement({
			'label': element.label,
			'data' : select
		});
	},
	
	/*
	 * Простой вывод елемента в виде текста
	 */
	'label': function(element){
		
		return this.addFormElement({
			'label' : element.label,
			'data'  : element.value
		});
		
	},
	
	/*
	 * Скрытое поле
	 */
	'hidden': function(element){
		
		new Element('input', {
			'name': element.name,
			'type': 'hidden',
			'value': element.value
		}).inject(this.wEdit.form);
		
		
		return this.emptyElement();
	},
	
	/*
	 * radio
	 */
	'radio': function(element){
		
		var div = new Element('div');
			
		for (key in element.options) {
			
			if ($type(element.options[key]) !='string') continue;
			
			var checked = (key==element.value?true:false);
			
			if (element.readonly){
				new Element('input',{
					'type'  : 'hidden',
					'name'  : element.name,
					'value' : element.value
				}).inject(div);
				element.disabled = true;
			}
			
			var radio = new Element('input',{
				'name': element.name,
				'type' :'radio',
				'checked': checked,
				'disabled': element.disabled || false,
				'value' : key
			}).inject(div);
			
			//radio.readonly = true;
			
			new Element('label', {
				'html':element.options[key]							
			}).inject(div);
			
		}
		
		return this.addFormElement({
			'label': element.label,
			'data' : div
		});
	},
	
	
//TODO довести до ума	
	/*
	 * checkbox
	 */
	'checkbox' : function(element){
			
		new Element('input',{
				'type'  : 'hidden',
				'name'  : element.name,
				'value' : 0
			}).inject(this.wEdit.form);
		element.disabled = true;

		var checked = false;
		
		if (element.value && element.value != 0)checked = true;
		
		var el = new Element('input', {
			'name' 	  : element.name,
			'type' 	  : 'checkbox',
			'checked' : checked,
			'value'   : 1
		});

			
		return this.addFormElement({
			'label': element.label,
			'data' : el
		});
	},
	
	/*
	 * Форма загрузки изображений
	 */
	'image' : function(element){
		
		var div = new Element('div',{'class':'image-box'});
		
		if (element.value) {
			
			new Element('img', {
				'src'   : element.value,
				'align' : 'left',
				'alr'   : element.value
			}).inject(div);
		}
		
		new Element('input', {
			'name'  	: element.name,
			'type'  	: 'text',
			'value' 	: element.value,
			'class'		: 'inpt',
			'events' 	: {
				'focus':function(){
					this.select();
				}
			}
			
		}).inject(div);
		
		
		var img_div = new Element('div', {
			'class':'file-box'
		}).inject(div);
		
		new Element('div', {
			'class':'file-text',
			'html':'Загрузить изображение'
		}).inject(img_div);
		
		new Element('input',{
			'name' : element.name + '_file',
			'type' : 'file',
			'size' : '1',
			'events':{
				'change':function(){
					
					this.getParent('div.image-box').getElement('input[type=text]').value = this.value;
					this.getParent('div.image-box').getElement('.delete-image').setStyle('display', '');
					
				}
			}
		}).inject(img_div);
		
		if (element.value) {
			new Element('div', {
				'html'   : 'Удалить изображение',
				'class'  : 'delete-image',
				'events' : {
					'click' : function(){
						
						var img = this.getParent('div').getElement('img');
						if (img) img.destroy();
						
						this.getParent('div.image-box').getElement('input[type=text]').value = '';
						
						this.setStyle('display', 'none');
					}
				}
			}).inject(div);
		}
		
		return this.addFormElement({
			'label': element.label,
			'data' : div
		});
		
	},
	
	/**
	 * текстовое поле
	 **/
	'text' : function(element){
		
		var el = new Element('input',{
			'name'  : element.name,
			'type'  : 'text',
			'value' : element.value,
			'class' : 'inpt'
		});
		
		return this.addFormElement({
			'label': element.label,
			'data' : el
		});
		
		
	},
	
	/**
	 * textarea
	 **/
	'textarea': function(element){
		
		
		ed = new Element('div');
		
		var ta = new Element('textarea',{
			'name'  : element.name,
			'class' : Browser.Engine.trident?'win':'all'
		}).appendText(element.value || '');
		
		ta.inject(ed);
		
		if (typeof tinyMCE != 'undefined') {
			
			var $this = this;
			
			new Element('div', {
				'html'  : 'Расширенный редактор',
				'class' : 'openeditor',
				'events': {
					'click':function(){
						
						$this.createTiny(this);
						
					}
				}
			}).inject(ed);
		}
		return this.addFormElement({
			'label': element.label,
			'data' : ed
		});
	},
	/**
	 * создает окно с редактором tinyMCE
	 * @param {Object} taId
	 */
	'createTiny' : function(el){
		
		var row = el.getParent('div.row');
		
		var label_text = row.getElement('div.label').getElement('div.container').get('html');
		
		var textareaElement = row.getElement('div.data').getElement('textarea');
		
		var tinymceWindow = new dWindow({
			//id: 'tynyMCEarea',
			'title'		: label_text,
			'width'		: 700,
			'height'	: 540,
			'minWidth'	: 180,
			'minHeight'	: 160,
			'shadow' 	: true,
			'addClass'  : 'editorWindow',
			'resizable' : false
		});
		
		//this.tinymceEditId = "ta" + taId;
		
		var cont = new Element('div');
		
		var form = new Element('textarea',{
			'id' : 'txaEditableContent',
			'styles': {
				'width' : '700px',
				'height' : '500px'
			}
		}).appendText(textareaElement.get('text')).inject(cont);
		
		
		var control = new Element('div', {
			'class':'control',
			'styles':{
				'width':'98%',
				'margin': '4px'
			}
		}).inject(cont);
		
		new Element('input', {
			'type' : 'button',
			'value' : 'Ok',
			'class' : 'btn',
			'events' : {
				'click' : function(){
					
					textareaElement.set('text', tinyMCE.get('txaEditableContent').getContent());
					tinymceWindow.close();
					
				}.bind(this)
			}
		}).inject(control);
		
		new Element('input', {
			'type' : 'button',
			'value' : 'Отмена',
			'class' : 'btn',
			'events' : {
				'click' : function(){
					
					tinymceWindow.close();
					
				}.bind(this)
			}
		}).inject(control);

		tinymceWindow.addEvents({
			
			'onshow' : function(){
				
				tinymceWindow.load(cont)
				
				tinyMCE.execCommand("mceAddControl", false, 'txaEditableContent');
				
			}.bind(this),
			'beforeclose' : function(){
				
				tinyMCE.execCommand('mceRemoveControl', false, 'txaEditableContent');
				
			}
		});
		
		tinymceWindow.show();
	}
});